package com.example.myapplication

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.orhanobut.logger.Logger
import kotlinx.coroutines.*

/**
 * 类描述:
 * 创建人:   tangchao$
 * 创建时间: 2021/6/30$ 10:44 PM$
 * 联系方式: 419704299@qq.com
 * 修改人:   tangchao$
 * 修改时间: 2021/6/30$ 10:44 PM$
 * 修改备注:  [说明本次修改内容]
 */
class Kotlin2ViewModle : ViewModel() {
    var mutableLiveData = MutableLiveData<User>()
    fun getData() {
        viewModelScope.launch {
            var str = fun0()
            Logger.d("Kotlin2ViewModle===getData: " + str);


        }
    }

    suspend fun fun0() = withContext(Dispatchers.Default) {
        mutableLiveData.value = User("11")
    }

    /**
     * 同时发起两个网络请求。在suspend 函数里面可以通过coroutineScope 或 supervisorScope 安全地启动协程。
     * 为了避免泄漏，我们希望fetchTwoDocs这样的函数返回的时候，在函数内部启动的协程都能执行完成。

    结构化并发保证当suspend函数返回的时候，函数里面的所有工作都已经完成

    作者：MarioFeng
    链接：https://juejin.cn/post/6844903871655968781
    来源：掘金
    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    suspend fun fetchTwoDocs() {

        coroutineScope {
            launch { fun0() }
            launch { fun0() }
        }
    }

    suspend fun test2() {
        val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
            Logger.d("Kotlin2ViewModle===test2:协程的启动模式 ");
        }
        job.join()
    }

    suspend fun loadLots() {
        coroutineScope {
            repeat(1000) {
                launch { fetchDoc(it) }
            }
        }
    }

    private suspend fun fetchDoc(it: Int): Int {
        var a = withContext(Dispatchers.IO) {
            5678
        }
        return a
    }


}

